﻿using SUNRPA.CONTROLS.IMPL.domain;
using SUNRPA.CONTROLS.IMPL.domain.constant;
using SUNRPA.CONTROLS.IMPL.domain.flowItemParam;
using SUNRPA.CONTROLS.IMPL.domain.flowRunningVar;
using SUNRPA.CONTROLS.IMPL.util;
using System.Collections.Concurrent;

namespace SUNRPA.CONTROLS.IMPL.controls {
    /// <summary>
    /// TODO:1、缺少组合键功能，之后再做
    ///      2、完善输入法切换机制，可以正确的切换输入法
    /// </summary>
    public class KeyBoardInputNAction:BaseControlActions {
        public override int Execute(int currentIndex, FlowItem item, ConcurrentDictionary<string, ConcurrentDictionary<string, RPAVariableDefineWrapper>> globleData, List<FlowItem> flowItems) {
            KeyBoardInputNParam? param = item.ControlParam as KeyBoardInputNParam;
            //先切换英文键盘
            IntPtr foregrounWindow =  User32Utils.GetForegroundWindow();
            if(param.ForceEnglishKeyBoard) {
                //强制美式键盘
                User32Utils.SendMessage(foregrounWindow, (int)WinMessages.WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, User32Utils.LoadKeyboardLayout("00000409", 1));
            }

            //间隔时间
            int keyStep = param.KeyStep;
            if(keyStep < 0) { 
                keyStep = 0;
            }

            string inputText = param.InputText;
            List<string> specialKey = this.GetStringVar(ref inputText, globleData);
            //1）每个按键由一个或多个字符表示。为了指定单一键盘字符，必须按字符本身的键。例如，为了表示字母 A，可以用 "A" 作为 string。为了表示多个字符，就必须在字符后面直接加上另一个字符。例如，要表示 A、B 及 C，可用 "ABC" 作为 string。 
            //2）对 SendKeys 来说，加号 (+)、插入符 (^)、百分比符号 (%)、上划线 (~) 及圆括号 ( ) 都具有特殊意义。为了指定上述任何一个字符，要将它放在大括号 ({}) 当中。例如，要指定正号，可用 {+} 表示。方括号 ([ ]) 对 SendKeys 来说并不具有特殊意义，但必须将它们放在大括号中。在其它应用程序中，方括号有特殊意义，在出现动态数据交换 (DDE) 的时候，它可能具有重要意义。为了指定大括号字符，请使用 {{} 及 {}}。
            //3) 为了指定那些与 SHIFT、CTRL 及 ALT 等按键结合的组合键,Shift用“+”Ctrl用“^”Alt用“%”标识。例如，为了说明按下E与C的时候同时按下Shift键，请使用 "+(EC)"。为了说明在按下E的时候同时按下SHIFT键，但接着按C而不按SHIFT，则使用 "+EC"(组合)
            //4）之后会添加案件步骤，将案件一个一个发送出去现在先整体发送
            string[] arr = inputText.Split(new string[] {"<|>"}, StringSplitOptions.RemoveEmptyEntries);
            for(int i = 0; i < arr.Length; i ++) { 
                char[] texts = arr[i].ToCharArray();
                foreach(char text in texts) { 
                    SendKeys.SendWait(text.ToString());
                    Thread.Sleep(keyStep);
                }
                if(specialKey.Count > i) { 
                    SendKeys.SendWait(specialKey[i]);
                }
            }
            return currentIndex;
        }
    }
}
